package com.example.demo.common;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 自定义拦截器
 */
@Component // 将标注 @Component注解的类交由spring管理
public class LoginInterceptor implements HandlerInterceptor {
    /* 调用目标方法之前执行的方法
    此方法返回 Boolean 类型的值：
        如果返回的是 TRUE 表示（拦截器）验证成功，继续走后续的流程，执行目标方法
        如果返回 false，表示拦截器执行失败，验证未通过，后续的流程和目标方法不执行了，直接 return了
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        // 用户登录判断业务
        HttpSession session = request.getSession(false);  // 如果当前会话为空，返回 null
        if(session != null && session.getAttribute("session_userinfo") != null) {
            // 用户已经登录
            return true;
        }
        // 没有登陆，跳转到登录页面，以百度页面表示登录页面
//        response.sendRedirect("http://www.baidu.com");
//        response.setStatus(401); // 没有登录的话，也可以设置状态码， 401 表示没有状态

        response.setContentType("application/json; charset=utf8");
//        response.setCharacterEncoding("utf8");  // 设置编码格式 utf8防止乱码，也可以写在上边的里边

        /* response.getWriter()返回的是PrintWriter，这是一个打印输出流
        (1)response.getWriter().write(）和 response.getWriter().print(）是响应给客户端的东西，
            如果不用ajax接收将数据放在合适的位置，就会在浏览器上生成一个新的页面来显示内容。
        (2)response.getWriter().print(),不仅可以打印输出文本格式的（包括html标签），
            还可以将一个对象以默认的编码方式转换为二进制字节输出
        (3)response.getWriter().writer(),只能打印输出文本格式的（包括html标签），不可以打印对象
         */
        response.getWriter().println("{\"code:\":-1, \"msg:\":\"登陆失败\", \"data\":\"\"}");
        return false;
    }
}
